package a05_ThreadInstance;

/**
 * @Author quan
 * @Description 解决多线程环境下不安全的办法：加锁
 * @Date 2023/5/10 16:07
 */
public class SingletonLazyLock {
    //定义一个类成员变量
    private static volatile SingletonLazyLock instance = null;
    //构造方法私有化
    private SingletonLazyLock(){};
    //外界获取实例对象的方法
    //方法1：加锁：在方法上加锁
//    public static synchronized SingletonLazyLock getInstance(){
//        //在获取类成员变量的时候进行判断，是否已经初始化创建
//        //如果没有则进行初始化创建
//        if(instance == null){
//            instance = new SingletonLazyLock();
//        }
//        return instance;
//    }

    //方法2：在代码块中加锁
    public static SingletonLazyLock getInstance(){
        //在获取类成员变量的时候进行判断，是否已经初始化创建
        //如果没有则进行初始化创建
//        synchronized(SingletonLazy.class){
//            if (instance == null) {
//                instance = new SingletonLazyLock();
//            }
//        }
        //不正确
//        if (instance == null) {
//            synchronized(SingletonLazy.class){
//                instance = new SingletonLazyLock();
//            }
//        }
        if (instance == null) {
            synchronized(SingletonLazy.class){
                if (instance == null) {
                    instance = new SingletonLazyLock();
                }
            }
        }
        return instance;
    }
}
